package br.com.redefranciscanas.wiki.persistence;

import java.util.List;

import javax.persistence.NoResultException;

import javax.persistence.Query;

import br.com.redefranciscanas.wiki.domain.Item;
import br.com.redefranciscanas.wiki.util.PersistenceUtil;

public class ItemDao extends Dao { 

	public ItemDao() {
		super();
	}

	public Item buscaItemPeloNomeDoArquivo(String nomeDoArquivo) {
		Item item;
		Query query = getSession().createNamedQuery("Item.findBynomeDoArquivo");
		query.setParameter("nomeDoArquivo", nomeDoArquivo);
		try {
			item = (Item) query.getSingleResult();
		} catch (NoResultException e) {
			item = null;
		}
		return item;
	}
	
	@SuppressWarnings("unchecked")
	public List<Item> buscaItemPeloIdTopico(Long idTopico) {
		List<Item> item;
		Query query = getSession().createNamedQuery("Item.findByIdTopico");
		query.setParameter("idTopico", idTopico);
		try {
			item = query.getResultList();
		} catch (NoResultException e) {
			item = null;
		}
		return item;
	}

	public void insere(Item item) {
		if (!verificaSeHaItemComNomeDoArquivo(item.getNomeArquivo())) {
			try {
				setTransaction(getSession().getTransaction());
				getTransaction().begin();
				getSession().persist(item);
				getTransaction().commit();
			} catch (Exception e) {
				getTransaction().rollback();
				System.out.println("Erro ao inserir! " + e.getMessage());
			}
		} else {
			System.out.println("Item não foi inserido com sucesso!");
		}
	}

	// TODO
	public void atualiza(Item func) {
		try {
			setTransaction(getSession().getTransaction());
			getTransaction().begin();
			getSession().merge(func);
			getTransaction().commit();

		} catch (Exception e) {
			getTransaction().rollback();
			System.out.println("Erro ao atualizar! " + e.getMessage());
		} finally {
			PersistenceUtil.closeSession(getSession());
		}
	}

	// TODO
	public void deleta(Item funcionario) {
		try {
			setTransaction(getSession().getTransaction());
			getTransaction().begin();
			getSession().remove(funcionario);
			getTransaction().commit();
		} catch (Exception e) {
			getTransaction().rollback();
			System.out.println("Erro ao deletar! " + e.getMessage());
		} finally {
			PersistenceUtil.closeSession(getSession());
		}
	}

	public boolean verificaSeHaItemComNomeDoArquivo(String nomeDoArquivo) {
		if (buscaItemPeloNomeDoArquivo(nomeDoArquivo) != null) {
			return true;
		} else {
			return false;
		}
	}

}
